%
% Carátula oficial de 75.02 Algoritmos y Programación I, cátedra Cardozo.
%
% Basado en el template realizado por Diego Essaya, disponible en
%                                                         http://lug.fi.uba.ar
% Modificado por Michel Peterson.
% Modificado por Sebastián Santisi.
% Afando por Juan Antonio Zuloaga para el tp de Orga66.20

%
% Acá se define el tamaño de letra principal:
%
\documentclass[12pt]{article}

%------------------------- Carga de paquetes ---------------------------
%
% Si no necesitás algún paquete, comentalo.
%

%
% Definición del tamaño de página y los márgenes:
%
\usepackage[a4paper,headheight=16pt,scale={0.7,0.8},hoffset=0.5cm]{geometry}

%
% Vamos a escribir en castellano:
%
\usepackage[spanish]{babel}
%\usepackage[latin1]{inputenc}
\usepackage[utf8]{inputenc}


%
% Si preferís el tipo de letra Helvetica (Arial), descomentá las siguientes
% dos lineas (las fórmulas seguirán estando en Times):
%
%\usepackage{helvet}
%\renewcommand\familydefault{\sfdefault}

%
% El paquete amsmath agrega algunas funcionalidades extra a las fórmulas. 
% Además defino la numeración de las tablas y figuras al estilo "Figura 2.3", 
% en lugar de "Figura 7". (Por lo tanto, aunque no uses fórmulas, si querés
% este tipo de numeración dejá el paquete amsmath descomentado).
%
\usepackage{amsmath}
\numberwithin{equation}{section}
\numberwithin{figure}{section}
\numberwithin{table}{section}

%
% Para tener cabecera y pie de página con un estilo personalizado:
%
\usepackage{fancyhdr}

%
% Para poner el texto "Figura X" en negrita:
% (Si no tenés el paquete 'caption2', probá con 'caption').
%
\usepackage[hang,bf]{caption2}

%
% Para poder usar subfiguras: (al estilo Figura 2.3(b) )
%
%\usepackage{subfigure}

%
% Para poder agregar notas al pie en tablas:
%
%\usepackage{threeparttable}

%------------------------------ graphicx ----------------------------------
%
% Para incluir imágenes, el siguiente código carga el paquete graphicx 
% según se esté generando un archivo dvi o un pdf (con pdflatex). 

% Para generar dvi, descomentá la linea siguiente:
%\usepackage[dvips]{graphicx}

% Para generar pdf, descomentá las dos lineas seguientes:
\usepackage[pdftex]{graphicx}
\pdfcompresslevel=9

%
% Todas las imágenes están en el directorio tp-img:
%
\newcommand{\imgdir}{includes}
\graphicspath{{\imgdir/}}
%
%------------------------------ graphicx ----------------------------------

% Necesitas este paquete si haces los diagrámas de flujo en el prográma Dia 
%\usepackage{tikz}


%------------------------- Inicio del documento ---------------------------

%
% Carátula:
%
% Título principal del documento.
\title{ \includegraphics[scale=0.3]{fiuba}
\\
\textbf{TRABAJO PRÁCTICO Nº0}
\\  Infraestructura Básica}

% Información sobre los autores.
\author{Juan Antonio Zuloaga Mellino, \textit{Padrón Nro. 89.537}                     \\
            \texttt{ jzuloaga@fi.uba.ar }                                              \\
            Damián Ezequiel Moguilevsky, \textit{Padrón Nro. 90.174}                     \\
            \texttt{ dmoguilevsky@fi.uba.ar }                                              \\
            Maximiliano Gismondi, \textit{Padrón Nro. 89.957}                     \\
            \texttt{ maxig88@gmail.com }                                              \\
            \normalsize{ Año 2011 - 1\textsuperscript{er} Cuatrimestre}                       \\
            \normalsize{66.20 Organización de Computadoras}                             \\
            \normalsize{Facultad de Ingeniería, Universidad de Buenos Aires}            \\
       }
%\date{\today}
\date{} %Sin Fecha

\begin{document}

%
% Hago que en la cabecera de página se muestre a la derecha la sección,
% y en el pie, en número de página a la derecha:
%
\pagestyle{fancy}
\renewcommand{\sectionmark}[1]{\markboth{}{\thesection\ \ #1}}
\lhead{}
\chead{}
\rhead{\rightmark}
\lfoot{}
\cfoot{}
\rfoot{\thepage}

\begin{titlepage}

% Inserta el título.
\maketitle
\vfill
% Resumen
\begin{abstract}
El trabajo práctico consiste en la programación de un comparador de archivos de texto plano, línea por línea y su compilación en entornos \mbox{\emph{x86\_64-GNU/linux}} y \emph{NetBSD/pmax}.

%El Objetivo del trabajo consiste en la familiarización con el sistema tipográfico \TeX, la máquina virtual \emph{GXemul} y el sistema operativo \emph{NetBSD/pmax}.

%No se me ocurre que más chamuyar en el resumen.
\end{abstract}
\vfill
% Quita el número en la primer página.
\thispagestyle{empty}
\end{titlepage}


\newpage

%
% Hago que las páginas se comiencen a contar a partir de aquí:
%
\setcounter{page}{1}

%
% Pongo el índice en una página aparte:
%% Saco el índicie, el primer TP no lo merece
%\tableofcontents

%
% Inicio del TP:
%
\section{Introducción}
El Objetivo del trabajo consiste en la familiarización con el sistema tipográfico \TeX, la máquina virtual \emph{GXemul} y el sistema operativo \emph{NetBSD/pmax}.
Se programó un comparador de líneas texto plano, que indique la diferencias encontradas entre dos archivos de entrada.
El formato de salida imprime los números de líneas en los que se encuentran diferencias y a continuación los caracteres en esa línea (columnas) que los poseían.
Los caracteres no imprimibles también son tomados en cuenta en las comparaciones.
En el caso que las líneas comparadas sean totalmente diferentes, esto es indicado en vez de los números de columna con diferencias.
El programa acepta los siguientes argumentos en línea de comandos:
\begin{tabular}{l l l}
-v & --version & Imprime la versión del programa y sale. \\
-h & --help & Imprime un mensaje de ayuda sale. \\
-o & --output & Especifica el archvio de salida. \\
-m & --max & Detiene la comparación luego de encontrar las primeras m diferencias \\
\end{tabular}
\section{Diseño e Implementación}
Se aprovecha la implementación de la función get-opt de la biblioteca de GNU C para el parseo de argumentos en línea de comandos.

El programa fue implementado utilizando lenguaje C y programación estructurada.

El procesamiento de los archivos se realiza cargando en memoria dinámica las dos líneas a comparar, realizando las comparación entre ambas carácter a carácter.
Una vez finalizada se imprimen las diferencias y se libera la memoria correspondiente a esas líneas para proseguir con el procesamiento del siguiente par de líneas.

Éste enfoque en el procesamiento se debe al requerimiento de informar sobre líneas completamente diferentes, con la salida \emph{all line}, lo que no permite 
producir la salida simultáneamente al procesamiento de los archivos.

Para la lectura de las líneas se implementa la función \textbf{leerlinea()} que también se encarga de reservar la memoria necesaria. No se utiliza 
la función estándar \textbf{fgets()} para permitir la carga dinámica de líneas de longitud arbitraria.

En el caso de especificarse la opción que delimita el máximo número de diferencias a mostrar, 
se establece este número como parámetro en la función que busca las diferencias línea a línea
y se decrementa luego de cada diferencia encontrada. De esta manera, se interrumpe la búsqueda al alcanzar la cantidad de diferencias deseadas.


\pagebreak
\section{Escructura Funcional}
Aquí se detallará brevemente el funcionamiento de las funciones implementadas.
\subsection{comparar\_linea\_y\_loggear()}
Esta función es la que se encarga de encontrar e imprimir las diferencias específicamente. Este 
proceso se realiza a partir de contar previamente con las líneas a comparar cargadas como entradas
de la función.

Para la comparación se determina previamente cuál es la línea más larga de las dos a comparar. 
Luego, se extiende la más corta para que contenga la misma cantidad de caracteres que la más larga, 
y de esta manera poder establecer correctamente todas las diferencias entre ambas. Luego, recorriendo
carácter a carácter se logra identificar cuáles son las diferencias existentes. En caso de no detectar 
ninguna diferencia no se hace nada y se continúa con el par de líneas siguientes. En caso contrario, si 
se detecta que difieren por completo entre ambas líneas y no se alcanza el límite de diferencias en el medio
del análisis, se imprime \emph{all line}. Por último, si no se alcanzara ninguno de los dos casos extremos 
se imprime como salida \emph{line X: cols y1,y2,...,yn.}

\subsection{imprimir\_lineas\_sobrantes()}
Esta función se utiliza para todas aquellas líneas que se encuentran en uno sólo de los dos archivos
que se están comparando. Es decir, que si uno de los archivos cuenta con 1 línea y el otro con 10, esta
función se ocupará de procesar las líneas posteriores a la primera para el segundo archivo. El objetivo
es poder imprimir en la salida que la línea X sólo se encuentra en tal archivo.

\subsection{extender\_linea()}
Esta función simplemente se encarga de aumentar la cantidad de memoria necesaria para poder completar la línea más corta
del par a analizar de manera que se obtengan dos líneas de la misma longitud.

\subsection{agrandar\_memoria()}
Esta función es la que se encuentra utilizada para agrandar la memoria en caso de que no sea suficiente la memoria inicial
dispuesta para la lectura de alguna línea.

\subsection{leer\_linea()}
La función en cuestión se utiliza para llevar a cabo la lectura de una línea de alguno de los archivos.
Para esto, lo que se hace es ir tomando del archivo de a un carácter y analizar si se tiene memoria 
para alojarlo y si no se alcanzó el final del archivo que se está leyendo. En caso de determinar que
finalizó el archivo, se interrumpe la lectura. De manera contraria, si se determina que no hay más memoria para seguir 
leyendo se procede a aumentar la memoria y luego se continúa con la carga de los datos.

\subsection{mostrar\_ayuda() }
Esta sencilla función, sólo imprime en la salida correspondiente la ayuda, es decir, cómo se debe invocar al programa.
\subsection{mostrar\_version()}
De manera similar a la función anterior, en este caso, se trata de imprimir la versión actual del programa
que se está ejecutando.
\subsection{parsear\_opciones()}
Esta función es la que se encarga de examinar y determinar que opciones ingresó el usuario. De esta 
forma, mediante la utilización de la biblioteca \emph{getopt.h}, se accedió a utilizar la función \emph{getopt\_long}.
Por este motivo, resultó sencillo mediante llamadas sucesivas a la misma función y la identificación opción por opción,
determinar cuáles fueron las ingresadas por el usuario tanto en formato simple como extendido.

Por otra parte, la función de biblioteca ya cuenta intrínsicamente con la detección de aquellos casos
donde alguna de las opciones requiere un argumento y el mismo no haya sido ingresado.

Así también, resulta importante mencionar, que en base a las opciones detectadas se setean diversos \emph{flags}, así como 
de la misma forma se adquieren las rutas de los dos archivos a comparar.

\subsection{open\_files()}
Esta función es la que se encuentra realizada con el objetivo de intentar abrir los archivos de entrada
y que en caso de algún error en la apertura de alguno de ellos devuelve el error correspondiente.

\subsection{main()}
Si bien esta función cumple un rol determinante, es la encargada de ordenar el funcionamiento del programa
y llamar función a función para que se ejecute completamente. De la misma manera, es donde se encuentra la liberación
de la memoria solicitada y de los cierres de los archivos.
 
\pagebreak
\section{Comandos para compilar el programa}
El programa se compila, utilizando gcc, con un script provisto mediante el siguiente comando:
\\
\\
\noindent \texttt{
\$ ./compilar.sh
\\
\\
}
El ejecutable generado se alojar\'a en un nuevo directorio creado por el script llamado 'Ejecutable' bajo el nombre 'orga-tp0'.
Para que el script se ejecute correctamente se deben tener permisos suficientes para crear directorios y archivos.
\\
Estos pasos est\'an detallados en el archivo 'readme.txt'.
\vfill
%\pagebreak
\section{Corridas de prueba}
Todas la corrdias de prueba fueron realizadas en la máquina virtual \emph{3max} de \emph{gxemul}, ejecutando el sistema operativo \emph{NetBSD/pmax}.
\begin{figure}[!htb]
\begin{center}
\includegraphics[width=0.8\textwidth]{./includes/ps_h.png}
\end{center}
\caption{Mensaje de Ayuda}
\label{fig:helpFlag}
\end{figure}

\vfill

\begin{figure}[!htb]
\begin{center}
\includegraphics[width=0.8\textwidth]{./includes/ps_v.png}
\end{center}
\caption{Versión del Programa}
\label{fig:versionFlag}
\end{figure}

\vfill

\begin{figure}[!htb]
\begin{center}
\includegraphics[width=0.8\textwidth]{./includes/ps_1.png}
\end{center}
\caption{Comparación de los archivos 1 y 1b }
\label{fig:1y1b}
\end{figure}

\vfill

\begin{figure}[!htb]
\begin{center}
\includegraphics[width=0.8\textwidth]{./includes/ps_2.png}
\end{center}
\caption{Comparación de los archivos 2 y 2b}
\label{fig:2y2b}
\end{figure}

\begin{figure}[!htb]
\begin{center}
\includegraphics[width=0.8\textwidth]{./includes/ps_m.png}
\end{center}
\caption{Comparación de los archivos 1 y 1b utilizando la opción \emph{-m}}
\label{fig:2y2b}
\end{figure}
\vfill

\pagebreak

\section{Conclusión}
En la elaboración de este trabajo se evidencian diferencias entre arquitecturas y sistemas operativos.
Durante el desarrollo de un programa corto como este, el gcc produjo alertas de compilación para x86 que no figuraban en la versión del compilador para mips. De forma similar, en tiempo de ejecución aparece una alerta en llamadas al sistema relativa al manejo de archivos en NetBSD que no figura en Linux.
Esto muestra que incluso utilizando dos sistemas operativos similares (son ambos tipo Unix, aunque ninguno cumple completamente con el standard POSIX) existen diferencias que combinadas con malas prácticas de programación podrían llevar a la no portabilidad del código.

%\section{Bibliografía}
\begin{thebibliography}{99}
\bibitem{CPP11} cplusplus.com, ``C Library,'' 2011,\\
http://www.cplusplus.com/reference/clibrary/
\bibitem{GXE10} Anders Gavare  ``GXemul Documentation,'' versión 0.6.0,\\
http://gxemul.sourceforge.net
\bibitem{BSD11} Timo Rinne and Tatu Ylonen ``OpenSSH Manual pages,'' 2011,\\
BSD General Commands Manual
\bibitem{GETOPT} linux.die.net ``Linux man pages,'' 2011,\\
http://linux.die.net/man/3/getopt\_long
\end{thebibliography}
%%%%%FALTA LA BIBLIOGRAFÍA DE GETOP

%\section{Problemas y Resoluciones}
%\pagebreak

\end{document}
